<?php
/**
 * Classes utilitárias para a aplicação
 * @author		João Batista Neto
 * @package		rpo
 * @subpackage	util
 */
namespace rpo\util;

use rpo\base\Object;
use rpo\util\AbstractCollection;
use rpo\util\Set;

/**
 * Essa classe é o esqueleto de uma implementação da interface Set.<p>
 * Um Set é uma Collection, com a diferença que, por definição, um Set possui apenas elementos únicos
 * </p>
 * @author		João Batista Neto
 * @package		rpo
 * @subpackage	util
 * @category	list
 */
abstract class AbstractSet extends AbstractCollection implements Set {
	/**
	 * Adiciona um novo elemento ao set
	 * @param Object $o
	 * @return boolean
	 */
	public function add( Object $o ){
		$ret = false;

		/**
		 * Como um Set só pode conter elementos únicos, fazemos a verificação se o elemento
		 * não existe ainda no Set antes de adicioná-lo.
		 */
		if ( !$this->contains( $o ) ){
			$ret = parent::add( $o );
		}

		return $ret;
	}
}